/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejemplolistaenlazada;

/**
 *
 * @author AdminLocal
 */
public class ListaEnlazada
{

    private NodoLista origen = null;
    private boolean permitirRepeticiones = false;

    public void añadirValor(int nuevoValor)
    {
        NodoLista nuevoNodo = new NodoLista();
        nuevoNodo.setValor(nuevoValor);
        añadirValor(nuevoNodo);
    }

    public boolean estaVacia()
    {
        if (origen == null)
        {
            return true;
        } else
        {
            return false;
        }
    }

    public void añadirValor(NodoLista nuevoNodo)
    {
        NodoLista nodoFinal = origen;
        if (!estaVacia())
        {
            if (nodoFinal.getValor() >= nuevoNodo.getValor())
            {
                nuevoNodo.setSiguiente(nodoFinal);
                origen = nuevoNodo;
            } else
            {
                while ((nodoFinal.getSiguiente() != null) && (nodoFinal.getSiguiente().getValor() < nuevoNodo.getValor()))
                {
                    nodoFinal = nodoFinal.getSiguiente();
                }
                if (nodoFinal.getSiguiente() != null)
                {
                    boolean mayor = nodoFinal.getSiguiente().getValor() > nuevoNodo.getValor();
                    boolean igual = nodoFinal.getSiguiente().getValor() == nuevoNodo.getValor();
                    if (mayor || (igual && permitirRepeticiones))
                    {
                        nuevoNodo.setSiguiente(nodoFinal.getSiguiente());
                        nodoFinal.setSiguiente(nuevoNodo);
                    }
                } else
                {
                    nodoFinal.setSiguiente((nuevoNodo));
                }
            }
        } else
        {
            origen = nuevoNodo;
        }

    }

    public void borrarValor(int valor)
    {
        NodoLista nodoBorrable = new NodoLista();
        nodoBorrable.setValor(valor);
        borrarValor(nodoBorrable);
    }

    /**
     * @return the valor
     */
    /**
     * @return the permitirRepeticiones
     */
    public boolean isPermitirRepeticiones()
    {
        return permitirRepeticiones;
    }

    /**
     * @param permitirRepeticiones the permitirRepeticiones to set
     */
    public void setPermitirRepeticiones(boolean permitirRepeticiones)
    {
        this.permitirRepeticiones = permitirRepeticiones;
    }

    private NodoLista encontrarInsertar(int valor)
    {
        NodoLista nodo = null;
        NodoLista aux = origen;
        while ((aux != null) && (aux.valor < valor))
        {
            nodo = aux;
            aux = aux.siguiente;
        }
        return nodo;
    }

    private NodoLista encontrarBorrar(int valor)
    {
        NodoLista aux = origen;
        NodoLista aux1 = null;
        while(aux.valor != valor)
        {
            aux1 = aux;
            aux = aux.siguiente;
        }
        return aux1;
    }

    private boolean contiene(NodoLista nodo)
    {
        NodoLista aux = origen;
        while ((aux != null) && (aux.valor != nodo.valor))
        {
                aux = aux.siguiente;
        }
        if(aux==null)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    private void borrarValor(NodoLista nodoBorrable)
    {
        NodoLista aux = encontrarBorrar(nodoBorrable.valor);
        if ((aux == null) || (aux.siguiente != null))
        {
            NodoLista aux1 = null;
            if (aux == null)
            {
                if (origen.siguiente != null)
                {
                    aux = origen;
                    origen = origen.siguiente;
                    aux.siguiente = null;
                } else
                {
                    origen = null;
                }
            } else
            {
                aux1 = aux.siguiente;
                aux.siguiente = aux.siguiente.siguiente;
                aux1.siguiente = null;
            }
        }
    }

    @Override
    public String toString()
    {
        String cadena = "";
        NodoLista aux = origen;
        while (aux != null)
        {
            cadena += "Valor: " + aux.valor + "\n";
            aux = aux.siguiente;
        }
        return cadena;
    }
}
